import sys
import os # 添加 os 导入
from PyQt6.QtWidgets import (
    QDialog, QVBoxLayout, QHBoxLayout, QListWidget, QLineEdit, 
    QPushButton, QMessageBox, QInputDialog, QLabel, QListWidgetItem
)
from PyQt6.QtCore import Qt, pyqtSlot

# 导入核心模块以获取常量
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
try:
    from core.alarm_manager import DEFAULT_CATEGORY
except ImportError:
    # Fallback if constants cannot be imported (e.g., when running standalone test)
    DEFAULT_CATEGORY = "工作" 

class CategoryDialog(QDialog):
    """对话框用于管理闹钟分类."""
    def __init__(self, alarm_manager, parent=None):
        super().__init__(parent)
        self.alarm_manager = alarm_manager
        self.setWindowTitle("管理分类")
        self.setMinimumWidth(350)
        
        # 设置对话框样式 (可选, 可以继承主窗口样式或单独设置)
        # self.setStyleSheet(parent.styleSheet()) # 尝试继承父窗口样式

        self.init_ui()
        self.load_categories()

    def init_ui(self):
        layout = QVBoxLayout(self)

        layout.addWidget(QLabel("现有分类:"))
        
        self.category_list = QListWidget()
        self.category_list.itemSelectionChanged.connect(self.update_button_states)
        layout.addWidget(self.category_list)

        button_layout = QHBoxLayout()
        
        self.add_button = QPushButton("添加")
        self.add_button.clicked.connect(self.add_category)
        button_layout.addWidget(self.add_button)

        self.rename_button = QPushButton("重命名")
        self.rename_button.clicked.connect(self.rename_category)
        self.rename_button.setEnabled(False) # 初始禁用，选中非默认项时启用
        button_layout.addWidget(self.rename_button)

        self.delete_button = QPushButton("删除")
        self.delete_button.clicked.connect(self.delete_category)
        self.delete_button.setEnabled(False) # 初始禁用，选中非默认项时启用
        button_layout.addWidget(self.delete_button)
        
        layout.addLayout(button_layout)

        # 关闭按钮
        close_button_layout = QHBoxLayout()
        close_button_layout.addStretch(1)
        self.close_button = QPushButton("关闭")
        self.close_button.clicked.connect(self.accept) # accept() 会关闭对话框
        close_button_layout.addWidget(self.close_button)
        layout.addLayout(close_button_layout)
        
    def load_categories(self):
        """从 AlarmManager 加载分类并显示在列表中."""
        self.category_list.clear()
        categories = self.alarm_manager.get_categories()
        for category in categories:
             item = QListWidgetItem(category)
             # 修改：检查是否为新的默认分类 DEFAULT_CATEGORY
             if category == DEFAULT_CATEGORY:
                 pass # 通过按钮状态控制
             self.category_list.addItem(item)
        self.update_button_states() # 更新按钮状态

    @pyqtSlot()
    def update_button_states(self):
        """根据列表选中项更新按钮的启用状态."""
        selected_items = self.category_list.selectedItems()
        is_non_default_selected = False
        if selected_items:
            selected_category = selected_items[0].text()
            # 修改：检查是否为新的默认分类 DEFAULT_CATEGORY
            if selected_category != DEFAULT_CATEGORY:
                is_non_default_selected = True
                
        self.rename_button.setEnabled(is_non_default_selected)
        self.delete_button.setEnabled(is_non_default_selected)

    @pyqtSlot()
    def add_category(self):
        """弹出输入框添加新分类."""
        text, ok = QInputDialog.getText(self, "添加分类", "请输入新的分类名称:")
        if ok and text:
            category_name = text.strip()
            if not category_name:
                 QMessageBox.warning(self, "提醒", "分类名称不能为空。")
                 return
                 
            if category_name in self.alarm_manager.get_categories():
                QMessageBox.warning(self, "提醒", f"分类 '{category_name}' 已存在。")
                return

            if self.alarm_manager.add_category(category_name):
                self.load_categories() # 成功添加后刷新列表
            else:
                 # 可能因为其他原因添加失败 (虽然目前逻辑比较简单)
                 QMessageBox.warning(self, "错误", "添加分类失败。")

    @pyqtSlot()
    def rename_category(self):
        """重命名选中的分类."""
        selected_items = self.category_list.selectedItems()
        if not selected_items:
            return 
            
        old_name_item = selected_items[0]
        old_name = old_name_item.text()

        # 修改：检查是否为新的默认分类 DEFAULT_CATEGORY
        if old_name == DEFAULT_CATEGORY:
            QMessageBox.information(self, "提示", f"不能重命名 '{DEFAULT_CATEGORY}' 分类。")
            return

        text, ok = QInputDialog.getText(self, "重命名分类", f"请输入 '{old_name}' 的新名称:", QLineEdit.EchoMode.Normal, old_name)
        if ok and text:
            new_name = text.strip()
            if not new_name:
                 QMessageBox.warning(self, "提醒", "分类名称不能为空。")
                 return
                 
            if new_name == old_name:
                 return # 名称未改变
                 
            # 修改：检查是否重命名为新的默认分类 DEFAULT_CATEGORY
            if new_name == DEFAULT_CATEGORY:
                 QMessageBox.warning(self, "提醒", f"不能将分类重命名为 '{DEFAULT_CATEGORY}'。")
                 return
                 
            if new_name in self.alarm_manager.get_categories():
                QMessageBox.warning(self, "提醒", f"分类 '{new_name}' 已存在。")
                return

            if self.alarm_manager.rename_category(old_name, new_name):
                self.load_categories() # 刷新列表
            else:
                 QMessageBox.warning(self, "错误", f"重命名分类 '{old_name}' 失败。")

    @pyqtSlot()
    def delete_category(self):
        """删除选中的分类."""
        selected_items = self.category_list.selectedItems()
        if not selected_items:
            return

        category_name = selected_items[0].text()

        # 修改：检查是否为新的默认分类 DEFAULT_CATEGORY
        if category_name == DEFAULT_CATEGORY:
            QMessageBox.information(self, "提示", f"不能删除 '{DEFAULT_CATEGORY}' 分类。")
            return

        reply = QMessageBox.question(self, "确认删除", 
                                     f"确定要删除分类 '{category_name}' 吗？\n使用此分类的闹钟将被归类到 '{DEFAULT_CATEGORY}'。",
                                     QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
                                     QMessageBox.StandardButton.No)

        if reply == QMessageBox.StandardButton.Yes:
            if self.alarm_manager.remove_category(category_name):
                self.load_categories() # 刷新列表
            else:
                 QMessageBox.warning(self, "错误", f"删除分类 '{category_name}' 失败。")


# 用于独立测试对话框
if __name__ == '__main__':
    # 需要一个模拟的 AlarmManager 或从 core 导入
    from PyQt6.QtWidgets import QApplication
    # 假设 AlarmManager 在上一级目录的 core 中
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    try:
        from core.alarm_manager import AlarmManager
        
        # 创建一个临时的 AlarmManager 实例 (它会尝试读写 data 目录)
        # 注意这可能会修改你实际的 data/categories.json 文件
        temp_manager = AlarmManager() 
        
        app = QApplication(sys.argv)
        dialog = CategoryDialog(temp_manager)
        dialog.exec() # 显示为模态对话框
        
        print("对话框已关闭。")
        # 你可以在这里检查 temp_manager._categories 是否已更改
        print("当前分类:", temp_manager.get_categories())
        
    except ImportError as e:
         print(f"无法导入 AlarmManager 进行测试: {e}")
    except Exception as e:
         print(f"测试时发生错误: {e}") 